/*
@title: cricket_frenzy
@description: Cricket Frenzy is a puzzle game where players use a cricket bat to move balls to designated targets through a maze.
@author: aryan.k
@tags: ['puzzle']
@addedOn: 2022-12-10
*/
const player = "p";
const box = "b";
const goal = "g";
const wall = "w";

setLegend(
[ player, bitmap `................
................
................
................
................
......0000000000
.....00999999990
.000039999999990
0333339999999690
.0000399999966C0
.....00999999CC0
......0000000000
................
................
................
................`],
[ box, bitmap`................
................
................
.....000000.....
....03333330....
...0333333330...
...0333333330... 
...0333333330... 
...03333333L0... 
...0333333LL0...
....03333LL0....
.....000000.....
................
................
................
................`],
[ goal, bitmap`................
................
................
.....000000.....
....03333330....
...0322222230...
...0323333230...
...0323223230...
...0323333230...
...0322222230...
....03333330....
.....000000.....
................
................
................
................`],
[ wall, bitmap`7777777777777777
7777777777777777
7777700000077777
7777703333077777
7777703333077777
7777700330077777
7777770330777777
7777770330777777
7777770000777777
7777777007777777
7777777007777777
7777777777777777
7777770000777777
7777770330777777
7777770000777777`]
);

let level = 0;
const levels = [
map`w...ww
.b..ww
.p..gw`,
map`w......
.......
p..ww..
.b.w...
..wg...
wwwwwww`,
map`p.wgw
wbw.w
....w
....w
...ww`,
map`w....w
p....w
..w..w
.bw..w
..wgww`,
map`p.w.
.bwg
....
..bg`,
map`w.gb.
..bg.
.....
w.pw.`,
map`wwwwww...wwwwwwwwwwwwww
...........wwwwwwwwwwww
...www.....wwwwwwwwwwww
.....ww....ww.w.wwwww.w
......ww...ww...wwww..w
.b.....ww.......ww....w
........www...........w
..........ww..........w
...........www.....p..w
.............www......w
...............ww....gw
...............wwwwwwww`,
map`....w.......w....
..b.w..wbw..w.b..
...ww.......www..
.......www.......
..w.........ww...
..ww...ggg.......
...w...ggg......w
...w....p.....w..
...w..........w..
..wwwwwwwww.www..
.bw...w.b...w.b..
..w...w.....w....`

];

const melody = tune`41.666666666666664: e4^41.666666666666664, 41.666666666666664: f5^41.666666666666664 + g5^41.666666666666664 + b5/41.666666666666664 + f4^41.666666666666664, 41.666666666666664: d4~41.666666666666664 + g5^41.666666666666664 + f5^41.666666666666664 + b5/41.666666666666664 + a5/41.666666666666664, 41.666666666666664: f4~41.666666666666664 + e4~41.666666666666664 + f5^41.666666666666664 + g5^41.666666666666664 + a5/41.666666666666664, 41.666666666666664: a4~41.666666666666664 + g4^41.666666666666664 + a5/41.666666666666664, 41.666666666666664: c5~41.666666666666664 + b4~41.666666666666664 + e4~41.666666666666664 + d4~41.666666666666664 + g5/41.666666666666664, 41.666666666666664: d5~41.666666666666664 + d4~41.666666666666664 + c5-41.666666666666664 + g5/41.666666666666664 + a4^41.666666666666664, 41.666666666666664: f5~41.666666666666664 + e5~41.666666666666664 + e4~41.666666666666664 + g5/41.666666666666664 + a4^41.666666666666664, 41.666666666666664: g5~41.666666666666664 + e4~41.666666666666664 + b4-41.666666666666664 + c5-41.666666666666664 + f5/41.666666666666664, 41.666666666666664: a5~41.666666666666664 + g5~41.666666666666664 + e4~41.666666666666664 + f4~41.666666666666664 + c5-41.666666666666664, 41.666666666666664: g5~41.666666666666664 + f4~41.666666666666664 + b4-41.666666666666664 + f5/41.666666666666664 + c5^41.666666666666664, 41.666666666666664: f5/41.666666666666664 + e4~41.666666666666664 + a4-41.666666666666664 + a5~41.666666666666664 + c5^41.666666666666664, 41.666666666666664: e5~41.666666666666664 + e4~41.666666666666664 + a4-41.666666666666664 + a5~41.666666666666664 + f5/41.666666666666664, 41.666666666666664: e5~41.666666666666664 + e4~41.666666666666664 + g5~41.666666666666664 + f5/41.666666666666664 + d5^41.666666666666664, 41.666666666666664: d5~41.666666666666664 + f4~41.666666666666664 + g5~41.666666666666664 + a5~41.666666666666664 + b5~41.666666666666664, 41.666666666666664: c5~41.666666666666664 + a5~41.666666666666664 + e5^41.666666666666664 + d5^41.666666666666664, 41.666666666666664: b4~41.666666666666664 + a4~41.666666666666664 + e5^41.666666666666664 + d4-41.666666666666664, 41.666666666666664: g4~41.666666666666664 + e5-41.666666666666664 + d5-41.666666666666664 + e4-41.666666666666664 + d4-41.666666666666664, 41.666666666666664: g4~41.666666666666664 + d5-41.666666666666664 + d4-41.666666666666664 + e5^41.666666666666664, 41.666666666666664: f4~41.666666666666664 + d5/41.666666666666664 + d4-41.666666666666664 + e5^41.666666666666664, 41.666666666666664: f4~41.666666666666664 + d5-41.666666666666664 + b4^41.666666666666664 + c4-41.666666666666664 + d4-41.666666666666664, 41.666666666666664: e4~41.666666666666664 + e5-41.666666666666664 + b4^41.666666666666664 + c4-41.666666666666664 + d4-41.666666666666664, 41.666666666666664: e4~41.666666666666664 + e5-41.666666666666664 + b4^41.666666666666664 + a4^41.666666666666664 + b5/41.666666666666664, 41.666666666666664: e4~41.666666666666664 + f5-41.666666666666664 + a4^41.666666666666664 + b5/41.666666666666664 + c5/41.666666666666664, 41.666666666666664: e4~41.666666666666664 + a4^41.666666666666664 + a5/41.666666666666664 + b4/41.666666666666664 + g5^41.666666666666664, 41.666666666666664: e4~41.666666666666664 + a4/41.666666666666664 + b4/41.666666666666664 + a5/41.666666666666664 + g5^41.666666666666664, 41.666666666666664: f4~41.666666666666664 + b4^41.666666666666664 + a5/41.666666666666664 + a4/41.666666666666664 + g5^41.666666666666664, 41.666666666666664: f4~41.666666666666664 + c4/41.666666666666664 + c5^41.666666666666664 + d5^41.666666666666664 + e5^41.666666666666664, 41.666666666666664: f4/41.666666666666664 + c4/41.666666666666664 + f5/41.666666666666664 + g5/41.666666666666664 + a5^41.666666666666664, 41.666666666666664: f4/41.666666666666664 + d4/41.666666666666664 + e5/41.666666666666664 + f5/41.666666666666664 + a5^41.666666666666664, 41.666666666666664: g4~41.666666666666664 + b5^41.666666666666664 + a5^41.666666666666664, 41.666666666666664: a4~41.666666666666664 + b5^41.666666666666664`
const playback = playTune(melody, Infinity)
const currentLevel = levels[level];
setMap(currentLevel);

setSolids([ player, box, wall ]);

setPushables({
[player]: []
});

onInput("s", () => {
getFirst(player).y += 1;
});

onInput("d", () => {
getFirst(player).x += 1;
});

onInput("w", () => {
getFirst(player).y -= 1;
});

onInput("a", () => {
getFirst(player).x -= 1;
});

onInput("j", () => {
const currentLevel = levels[level];
if (currentLevel !== undefined) {
clearText("");
setMap(currentLevel);
}
});

afterInput(() => {

const targetNumber = tilesWith(goal).length;

const numberCovered = tilesWith(goal, box).length;

if (numberCovered === targetNumber) {

level = level + 1;

const currentLevel = levels[level];


if (currentLevel !== undefined) {
  setMap(currentLevel);
} else {
  addText("COMPLETED", { y: 4, color: color`3` });
}
}
});

setPushables({
[player ]: [ box, player ]
})
